package me.lensfrex.trailblazer.api.v1.utils.jwt;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JWTManager {
    public static final int TOKEN_DEFAULT_EXPIRE_DAY = 15;

    // todo 时间有限先这样写能跑起来吧
    // todo 第一次生成之后应该存到数据库里边去的
    // todo 这样写的话每一次启动都是不同的密钥，已经生成的密钥会失效的
    private final static Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);

    private final static JWTManager self = new JWTManager();
    private JWTManager() {}

    public static JWTManager getInstance() {
        return self;
    }

    public String createNewJWT(String user, Date invalidDate) {
        Map<String, Object> header = new HashMap<>();
        header.put("alg", "HS256");
        header.put("typ", "JWT");

        Map<String, Object> payload = new HashMap<>();
        payload.put("user", user);
        payload.put("api_ver", "1");
//        payload.put("iss", machineId);

        return Jwts.builder()
                .setHeader(header)
                .setClaims(payload)
                .setExpiration(invalidDate)
                .signWith(key)
                .compact();

        // 这里生成token之后还是放在redis里边缓存一下吧
        // 但是考虑到各种因素就先不实现吧（懒）
    }

    public boolean verifyToken(String token) {
        try {
            Jws<Claims> jws =  Jwts.parserBuilder()
                    .setSigningKey(key)
                    .build()
                    .parseClaimsJws(token);
        } catch (JwtException e) {
            System.err.println("Error: token is wrong: " + e.getMessage());
            return false;
        }

        return true;
    }
}
